//
//  HXOauthViewController.swift
//  DemoSinaWeibo
//
//  Created by Mon on 15/11/27.
//  Copyright © 2015年 Mon. All rights reserved.
//

import UIKit

/// 第三方使用需要引入头文件
import SVProgressHUD

class HXOauthViewController: UIViewController {
    
    //为当前控制器的view设置为需要加载数据的webView
    override func loadView() {
        view = webView
        webView.delegate = self
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        //加载授权界面
        let request = NSURLRequest(URL: HXNetWorkTool.sharedNetWorkTool.oauthURL())
        webView.loadRequest(request)
        
        //为包装好的navigationView的webView设置好导航栏参数
        navigationItem.leftBarButtonItem = UIBarButtonItem(title: "填充", style: UIBarButtonItemStyle.Plain, target: self, action: "autoFill")
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "关闭", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
        
    }
    
    // MARK: - 懒加载
    private var webView: UIWebView = UIWebView()
    
    // MARK: - 实现按钮回调方法
    func autoFill() {
        //document.getElementById -- js命令,通过这个属性来找到对应的元素
            //创建js代码
        let js = "document.getElementById('userId').value = '15202070330'; document.getElementById('passwd').value = 'zhx15119673453.'"
            //让webView执行js代码
        webView.stringByEvaluatingJavaScriptFromString(js)
    }
    
    func close() {
//        print("closeView")
        //让第三方弹框消失
        SVProgressHUD.dismiss()
        //让modal出来的控制器消失
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    // 链接工具类,接收工具类加载出来的accesstoken,在这里进行处理处理
    func loadAccessToken(code: String) {
        //发送网络请求
        HXNetWorkTool.sharedNetWorkTool.loadAccessToken(code) { (result, error) -> () in
            if result == nil || error != nil {
                SVProgressHUD.showErrorWithStatus("网络延迟...")
                
                //延迟一点时间,让用户看到原因
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                    self.close()
                })
                
                return
            }
            
            //说明没有出错，保存数据(数据多,使用对象一并做保存处理)
            let userAccount = HXUserAccount(dict: result!)
            
            userAccount.saveAccount()
            
            self.close()
            
            // 切换mainVC
            print("userAccount:\(userAccount)")
//            (UIApplication.sharedApplication().delegate as? AppDelegate)?.switchController(false)
            AppDelegate.switchRootController(false)
        }
    }
}

// MARK：- 实现webView的delegate协议方法,使之能够弹框,与用户更好地交互
extension HXOauthViewController: UIWebViewDelegate {
    //webView开始加载链接方法 --- 弹框告诉用户当前正在加载
    func webViewDidStartLoad(webView: UIWebView) {
        // showWithStatus只有没有主动关闭,一直显示
        // showInfoWithStatus 过段时间就消失
//        SVProgressHUD.showInfoWithStatus("正在玩命加载...", maskType: SVProgressHUDMaskType.Gradient)
        SVProgressHUD.showWithStatus("正在玩命加载中...", maskType: SVProgressHUDMaskType.Gradient)
    }
    
    //webView加载完毕 --- 待画面webView加载出来后取消弹框
    func webViewDidFinishLoad(webView: UIWebView) {
//        dismissViewControllerAnimated(true, completion: nil) --- 取消当前控制器
        SVProgressHUD.dismiss()
    }
    
    //webView加载链接,每当webView加载一个链接都会通过这个代理方法来询问我们这个地址是否可以加载 true表示可以加载, false 就不加载.
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        
        let urlString = request.URL?.absoluteString
        print(" ----- \(urlString)")
        
        /*
            //用户点击取消
                http://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330
        
            //用户点击授权
                http://www.baidu.com/?code=21ff4f96facdaaebe9ba317aa44ef483
        */
        //如果用户点击的是"取消",那么需要返回访客视图或者登陆界面,而不是直接跳转回调的百度视图
        if !urlString!.hasPrefix(HXNetWorkTool.sharedNetWorkTool.redirect_uri){
            return true
        }
        
        //根据以上点击事件的不同,截取URL中？之后以code=结尾的不同,进行不同操作
            // 可选绑定, 截取URL中？之后string
        if let query = request.URL?.query {
            
            let codeString = "code="
            //判断截取的字符串是否以code=开头
            if query.hasPrefix(codeString) {
                //取出code值
                //将query转换成NSString
                let nsQuery = query as NSString
                let code = nsQuery.substringFromIndex(codeString.characters.count)
                //需要事件回调
                loadAccessToken(code)
                
            }else {
                //点击取消的话,就让控制器消失
                self.close()
            }
        }
        
        
        //需要做登陆拦截操作,如果不拦截的话,用户点击取消或者授权时,跳转到合适的界面
        return false
    }
}
